#define _GNU_SOURCE
#include "daemon_runner.h"
#include "daemon_sub_process.h"
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>

static int is_running = 1;

SubProcess *sub_processes[SUB_PROCESS_COUNT];

void stop_handler(int signo)
{
  is_running = 0;
}

/**
* 守护进程的主程序 
* //1 程序后台化 daemon()
* //2 重定向日志 把控制台的日志 重定向到日志文件
* //3 注册终止信号的处理函数
* //4 初始化 子进程
* //5 不断检查启动子进程 
* //6 退出所有子进程
*/
int daemon_runner_start()
{
// 程序进程后台化
// 参数1 0 把e程序主目录改为/ 参数2 0：关闭 输入输出错误 1 不关闭
daemon(0, 1); 

  // 关闭控制台输入 将日志输出重定向到日志文件
  close(STDIN_FILENO);
  close(STDOUT_FILENO);
  close(STDERR_FILENO);
  open("/dev/null", O_RDWR); // 标准输入 =》 丢弃所有写入的数据
  open(LOG_FILE, O_CREAT|O_WRONLY|O_APPEND, 0644); // 标准输出
open(LOG_FILE, O_CREAT|O_WRONLY|O_APPEND, 0644); // 标准错误输出

  // 注册终止信号处理函数
signal(SIGTERM, stop_handler);

  // 初始化子进程
  sub_processes[0] = daemon_sub_process_init("app");
sub_processes[1] = daemon_sub_process_init("ota");

  // 每隔2秒检查并启动子进程
  while (is_running) {
    for (int i = 0; i < SUB_PROCESS_COUNT; i++)
    {
      daemon_sub_process_checkStart(sub_processes[i]);
    }
    sleep(2);
}

  // 退出所有子程序
  for (int i = 0; i < SUB_PROCESS_COUNT; i++)
  {
    daemon_sub_process_exit(sub_processes[i]);
}

  return 0;
}